libxl: Convert E820_UNUSABLE and E820_RAM to E820_UNUSABLE as appropriate.
Most machines after the RAM regions in the e802 have a couple of
E820_RESERVED, with E820_ACPI and E820_NVS. On some Intel machines, the
E820 looks like swiss cheese:
(XEN) Initial Xen-e820 RAM map:
(XEN)
0000000000000000 -
000000000009d000 (usable)
(XEN)
000000000009d000 -
00000000000a0000 (reserved)
(XEN)
00000000000e0000 -
0000000000100000 (reserved)
(XEN)
0000000000100000 -
000000009cf66000 (usable)
(XEN)
000000009cf66000 -
000000009d102000 (ACPI NVS)
(XEN)
000000009d102000 -
000000009f6bd000 (usable) <--
(XEN)
000000009f6bd000 -
000000009f6bf000 (reserved)
(XEN)
000000009f6bf000 -
000000009f714000 (usable) <--
(XEN)
000000009f714000 -
000000009f7bf000 (ACPI NVS)
(XEN)
000000009f7bf000 -
000000009f7e0000 (usable) <--
(XEN)
000000009f7e0000 -
000000009f7ff000 (ACPI data)
(XEN)
000000009f7ff000 -
000000009f800000 (usable) <--
(XEN)
000000009f800000 -
00000000a0000000 (reserved)
(XEN)
00000000a0000000 -
00000000b0000000 (reserved)
(XEN)
00000000fc000000 -
00000000fd000000 (reserved)
(XEN)
00000000ffe00000 -
0000000100000000 (reserved)
(XEN)
0000000100000000 -
0000000160000000 (usable)
Which means we have to pay attention to the E820_RAM that are
between the E820_[ACPI,NVS,RESERVED]. If we remove those
E820_RAM (b/c the amount of memory passed to the guest
is less that where those E820 regions reside) from the E820, the
Linux kernel interprets those "gaps" as PCI I/O space.
This is what we are currently doing.
This can be disastrous if we pass in an Intel IGD card which tries
to use the first available PCI I/O space - and ends up
using the MFNs which are actually RAM instead of being the
PCI I/O space.
To make this work, we convert all E820_RAM that are above
the 'target_kb' (those that overlap the 'target_kb'
are truncated appropriately) to be E820_UNUSABLE. We also limit this
alternation up to 4GB. This means that an E820 for a guest
>from this (target_kb=1024, maxmem=2048):
[ 0.000000] Set 405658 page(s) to 1-1 mapping.
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] Xen:
0000000000000000 -
00000000000a0000 (usable)
[ 0.000000] Xen:
00000000000a0000 -
0000000000100000 (reserved)
[ 0.000000] Xen:
0000000000100000 -
0000000040000000 (usable)
[ 0.000000] Xen:
0000000040000000 -
000000009cf66000 (unusable)
[ 0.000000] Xen:
000000009cf66000 -
000000009d102000 (ACPI NVS)
[ 0.000000] Xen:
000000009f6bd000 -
000000009f6bf000 (reserved)
[ 0.000000] Xen:
000000009f714000 -
000000009f7bf000 (ACPI NVS)
[ 0.000000] Xen:
000000009f7e0000 -
000000009f7ff000 (ACPI data)
[ 0.000000] Xen:
000000009f800000 -
00000000b0000000 (reserved)
[ 0.000000] Xen:
00000000fc000000 -
00000000fd000000 (reserved)
[ 0.000000] Xen:
00000000fec00000 -
00000000fec01000 (reserved)
[ 0.000000] Xen:
00000000fee00000 -
00000000fee01000 (reserved)
[ 0.000000] Xen:
00000000ffe00000 -
0000000100000000 (reserved)
[ 0.000000] Xen:
0000000100000000 -
0000000140800000 (usable)
Will look as so:
[ 0.000000] Set 395880 page(s) to 1-1 mapping.
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] Xen:
0000000000000000 -
00000000000a0000 (usable)
[ 0.000000] Xen:
00000000000a0000 -
0000000000100000 (reserved)
[ 0.000000] Xen:
0000000000100000 -
0000000040000000 (usable)
[ 0.000000] Xen:
0000000040000000 -
000000009cf66000 (unusable)
[ 0.000000] Xen:
000000009cf66000 -
000000009d102000 (ACPI NVS)
[ 0.000000] Xen:
000000009d102000 -
000000009f6bd000 (unusable)
[ 0.000000] Xen:
000000009f6bd000 -
000000009f6bf000 (reserved)
[ 0.000000] Xen:
000000009f6bf000 -
000000009f714000 (unusable)
[ 0.000000] Xen:
000000009f714000 -
000000009f7bf000 (ACPI NVS)
[ 0.000000] Xen:
000000009f7bf000 -
000000009f7e0000 (unusable)
[ 0.000000] Xen:
000000009f7e0000 -
000000009f7ff000 (ACPI data)
[ 0.000000] Xen:
000000009f7ff000 -
000000009f800000 (unusable)
[ 0.000000] Xen:
000000009f800000 -
00000000b0000000 (reserved)
[ 0.000000] Xen:
00000000fc000000 -
00000000fd000000 (reserved)
[ 0.000000] Xen:
00000000fec00000 -
00000000fec01000 (reserved)
[ 0.000000] Xen:
00000000fee00000 -
00000000fee01000 (reserved)
[ 0.000000] Xen:
00000000ffe00000 -
0000000100000000 (reserved)
[ 0.000000] Xen:
0000000100000000 -
0000000140800000 (usable)
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Committed-by: Ian Jackson <ian.jackson.citrix.com>